home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Screenblankers / GBlanker / GSource / Blankers / Fireworks / blank.c next >
C/C++ Source or Header  |  1996-09-26  |  4KB  |  221 lines

  1. /*
  2.  *  Copyright (c) 1994 Michael D. Bayne.
  3.  *  All rights reserved.
  4.  *
  5.  *  Please see the documentation accompanying the distribution for distribution
  6.  *  and disclaimer information.
  7.  */
  8.  
  9. #include <exec/memory.h>
  10. #include <hardware/custom.h>
  11. #include "/includes.h"
  12.  
  13. #define SCALE 100
  14. #define ACCEL 4
  15.  
  16. #define    MAX_FIRE       200
  17. #define    MAX_EXPLOSIONS 25
  18.  
  19. #define    NONE      0
  20. #define    FIRE      1
  21. #define    EXPLODING 2
  22.  
  23. extern __far struct Custom custom;
  24.  
  25. struct Fire
  26. {
  27.     BYTE type;
  28.     BYTE time;
  29.     ULONG x;
  30.     ULONG y;
  31.     LONG vx;
  32.     LONG vy;
  33.     LONG color;
  34. };
  35.  
  36. #define NUMBER 0
  37. #define POWER  2
  38. #define RADIUS 4
  39. #define MODE   6
  40.  
  41. struct Fire *FireTable, *LastFire;
  42. LONG MaxFires, NumFires, Power, Radius, Wid, Hei;
  43.  
  44. #include "Fireworks_rev.h"
  45. STATIC const UBYTE VersTag[] = VERSTAG;
  46.  
  47. VOID Defaults( PrefObject *Prefs )
  48. {
  49.     Prefs[NUMBER].po_Level = 16;
  50.     Prefs[POWER].po_Level = 5;
  51.     Prefs[RADIUS].po_Level = 6;
  52.     Prefs[MODE].po_ModeID = getTopScreenMode();
  53.     Prefs[MODE].po_Depth = 2;
  54. }
  55.  
  56. LONG CheckFire( struct Fire *f )
  57. {
  58.     if( f->x/SCALE >= Wid )
  59.         return 1;
  60.     
  61.     if( f->y/SCALE >= Hei )
  62.         return 1;
  63.     
  64.     return 0 ;
  65. }
  66.  
  67. VOID IterateFire( struct RastPort *Rast )
  68. {
  69.     LONG l;
  70.     struct Fire *f, *tf;
  71.     
  72.     if(( NumFires < MaxFires )&&( RangeRand( 100 ) > 90 ))
  73.     {
  74.         for( tf = FireTable; tf->type; tf++ );
  75.         if( tf != LastFire )
  76.         {
  77.             tf->type = FIRE;
  78.             tf->x = ( Wid / 4 + RangeRand( Wid / 2 )) * SCALE;
  79.             tf->y = ( Hei - 5 ) * SCALE;
  80.             tf->color = RangeRand(( 1L << Rast->BitMap->Depth ) - 1 ) + 1;
  81.             tf->vx = RangeRand( SCALE * Hei / 100 ) - SCALE;
  82.             tf->vy = -1 * ( Power * SCALE * Hei / 400 );
  83.             tf->time = RangeRand( 100 ) + 100;
  84.             NumFires++;
  85.         }
  86.     }
  87.     
  88.     for( f = FireTable; f != LastFire; f++ )
  89.     {
  90.         switch( f->type )
  91.         {
  92.         case NONE:
  93.             break;
  94.         case FIRE:
  95.             if( !f->time )
  96.             {
  97.                 for( l = 0, tf = FireTable; ( l < MAX_EXPLOSIONS )&&
  98.                     ( tf != LastFire ); tf++ )
  99.                 {
  100.                     if( !tf->type )
  101.                     {
  102.                         CopyMem( f, tf, sizeof( struct Fire ));
  103.                         tf->type = EXPLODING;
  104.                         tf->vx = ( RangeRand( 100 ) - 50 ) *
  105.                             ( Radius * Wid / 1000 );
  106.                         tf->vy = ( RangeRand( 100 ) - 50 ) *
  107.                             ( Radius * Hei / 1000 );
  108.                         tf->time = RangeRand( 10 ) + 50;
  109.                         l++;
  110.                     }
  111.                 }
  112.                 NumFires--;
  113.                 f->type = NONE;
  114.             }
  115.             else
  116.             {
  117.                 SetAPen( Rast, 0 );
  118.                 WritePixel( Rast, f->x/SCALE, f->y/SCALE );
  119.                 f->x += f->vx;
  120.                 f->y += f->vy;
  121.                 if( CheckFire( f ))
  122.                 {
  123.                     f->type = NONE;
  124.                     NumFires--;
  125.                 }
  126.                 else
  127.                 {
  128.                     SetAPen( Rast, f->color );
  129.                     WritePixel( Rast, f->x/SCALE, f->y/SCALE );
  130.                     f->vy += ACCEL;
  131.                     f->time--;
  132.                 }
  133.             }
  134.             break;
  135.         case EXPLODING:
  136.             SetAPen( Rast, 0 );
  137.             WritePixel( Rast, f->x/SCALE, f->y/SCALE );
  138.             if( !f->time )
  139.                 f->type = NONE;
  140.             else
  141.             {
  142.                 f->x += f->vx;
  143.                 f->y += f->vy;
  144.                 if( CheckFire( f ))
  145.                     f->type = NONE;
  146.                 else
  147.                 {
  148.                     SetAPen( Rast, f->color );
  149.                     WritePixel( Rast, f->x/SCALE, f->y/SCALE );
  150.                     f->vy += ACCEL;
  151.                     f->time--;
  152.                 }
  153.             }
  154.             break;
  155.         }
  156.     }
  157. }
  158.  
  159. LONG Blank( PrefObject *Prefs )
  160. {
  161.     struct Screen *Scr;
  162.     struct Window *Wnd;
  163.     LONG ToFrontCount = 0, RetVal = OK;
  164.     
  165.     MaxFires = Prefs[NUMBER].po_Level;
  166.     Power = Prefs[POWER].po_Level;
  167.     Radius = Prefs[RADIUS].po_Level;
  168.     
  169.     FireTable = AllocVec( sizeof( struct Fire ) * ( MAX_FIRE + 1 ),
  170.                          MEMF_CLEAR );
  171.     
  172.     if( FireTable )
  173.     {
  174.         Scr = OpenScreenTags( 0L, SA_Depth, Prefs[MODE].po_Depth,
  175.                              SA_Overscan, OSCAN_STANDARD, SA_Quiet, TRUE,
  176.                              SA_DisplayID, Prefs[MODE].po_ModeID,
  177.                              SA_Behind, TRUE, TAG_DONE );
  178.         if( Scr )
  179.         {
  180.             LastFire = &( FireTable[MAX_FIRE] );
  181.             
  182.             Wid = Scr->Width;
  183.             Hei = Scr->Height;
  184.             
  185.             if( Prefs[MODE].po_Depth < 3 )
  186.                 setCopperList( Hei, 1, &( Scr->ViewPort ), &custom );
  187.             
  188.             SetRGB4(&( Scr->ViewPort ), 0, 0, 0, 0 );
  189.             SetRGB4(&( Scr->ViewPort ), 1, 0x0F, 0x0F, 0x0F );
  190.             SetRast(&( Scr->RastPort ), 0 );
  191.             
  192.             NumFires = 0;
  193.             Wnd = BlankMousePointer( Scr );
  194.             ScreenToFront( Scr );
  195.             
  196.             while( RetVal == OK )
  197.             {
  198.                 WaitTOF();
  199.                 IterateFire(&( Scr->RastPort ));
  200.                 if(!( ToFrontCount++ % 60 ))
  201.                     ScreenToFront( Scr );
  202.                 if(!( ToFrontCount % 5 ))
  203.                     RetVal = ContinueBlanking();
  204.             }
  205.             
  206.             UnblankMousePointer( Wnd );
  207.             if( Prefs[MODE].po_Depth < 3 )
  208.                 clearCopperList( &Scr->ViewPort );
  209.             CloseScreen( Scr );
  210.         }
  211.         else
  212.             RetVal = FAILED;
  213.  
  214.         FreeVec( FireTable );
  215.     }
  216.     else
  217.         RetVal = FAILED;
  218.     
  219.     return RetVal;
  220. }
  221.